<!DOCTYPE html>
<html>
  <head>
    <title>
      mediaelementaudiosourcenode.html
    </title>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit-util.js"></script>
    <script src="../resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      audit.define(
          {
            label: 'test',
            description: 'Basic tests for MediaElementAudioSourceNode API'
          },
          (task, should) => {

            let context = new AudioContext();

            let audioElement = new Audio();
            let mediaSource = context.createMediaElementSource(audioElement);
            let audioNode = mediaSource;

            // Check number of inputs and outputs.
            should(audioNode.numberOfInputs, 'audioNode.numberOfInputs')
                .beEqualTo(0);
            should(audioNode.numberOfOutputs, 'audioNode.numberOfOutputs')
                .beEqualTo(1);

            // Try calling connect() method with illegal values: illegal
            // destination, illegal output index, and illegal input index.
            should(
                () => audioNode.connect(0, 0, 0), 'audioNode.connect(0, 0, 0)')
                .throw(TypeError);
            should(
                () => audioNode.connect(context.destination, 5, 0),
                'audioNode.connect(context.destination, 5, 0)')
                .throw(DOMException, 'IndexSizeError');
            should(
                () => audioNode.connect(context.destination, 0, 5),
                'audioNode.connect(context.destination, 0, 5)')
                .throw(DOMException, 'IndexSizeError');

            // Verify same object is returned.
            let element = mediaSource.mediaElement;
            should(
                element instanceof HTMLMediaElement,
                'mediaSource.mediaElement instanceof HTMLMediaElement')
                .beTrue();
            should(
                mediaSource.mediaElement === element,
                'mediaSource.mediaElement is same object')
                .beTrue();

            // Try calling connect() with proper values.
            should(
                () => audioNode.connect(context.destination, 0, 0),
                'audioNode.connect(context.destination, 0, 0)')
                .notThrow();

            // Try creating another MediaElementAudioSourceNode using the same
            // audio element.
            should(
                () => context.createMediaElementSource(audioElement),
                'context.createMediaElementSource(audioElement)')
                .throw();

            task.done();
          });

      audit.run();
    </script>
  </body>
</html>
